Left align two graph edges (ggplot)

Używam ggplot i mam dwa wykresy, które chcę wyświetlić jeden na drugim. Użyłem grid.arrange z gridExtra do układania ich. Problem polega na tym, że chcę, aby lewe krawędzie Wykresów były wyrównane, a prawe niezależnie od etykiet osi. (problem pojawia się, ponieważ etykiety jednego wykresu są krótkie, podczas gdy drugi jest długi).

Pytanie:
Jak mogę to zrobić? Nie jestem żoną Grida.zorganizować ale ggplot2 jest koniecznością.

Co mam wypróbowany:
Próbowałem grać z szerokościami i wysokościami, a także ncol i nrow, aby stworzyć siatkę 2 x 2 i umieścić wizualizacje w przeciwnych rogach, a następnie grać z szerokościami, ale nie mogłem uzyskać wizualizacji w przeciwnych rogach.

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.arrange(A, B, ncol=1)

Tutaj wpisz opis obrazka

Author: baptiste, 2012-11-08

8 answers

Spróbuj tego,

 gA <- ggplotGrob(A)
 gB <- ggplotGrob(B)
 maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
 gA$widths[2:5] <- as.list(maxWidth)
 gB$widths[2:5] <- as.list(maxWidth)
 grid.arrange(gA, gB, ncol=1)

Edit

Oto bardziej ogólne rozwiązanie (działa z dowolną liczbą działek) przy użyciu zmodyfikowanej wersji rbind.gtable zawartej w gridExtra

gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))
 116
Author: baptiste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 00:01:09

Chciałem uogólnić to dla dowolnej liczby wątków. Oto rozwiązanie krok po kroku z wykorzystaniem podejścia Baptiste:

plots <- list(A, B, C, D)
grobs <- list()
widths <- list()

Zbierz szerokości dla każdego Groba każdej działki

for (i in 1:length(plots)){
    grobs[[i]] <- ggplotGrob(plots[[i]])
    widths[[i]] <- grobs[[i]]$widths[2:5]
}

Użyj do.wywołanie, aby uzyskać maksymalną szerokość

maxwidth <- do.call(grid::unit.pmax, widths)

Oznacz maksymalną szerokość każdego Groba

for (i in 1:length(grobs)){
     grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}

Wykres

do.call("grid.arrange", c(grobs, ncol = 1))
 31
Author: slizb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-11 16:18:12

Za pomocą cowplot Pakiet:

A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 

library(cowplot)
plot_grid(A, B, ncol=1, align="v")

Tutaj wpisz opis obrazka

 22
Author: zx8754,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-01 07:45:01

On http://rpubs.com/MarkusLoew/13295 jest naprawdę łatwe rozwiązanie dostępne (ostatnia Pozycja) Zastosowany do tego problemu:

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
grid.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first"))

Możesz również użyć tego dla szerokości i wysokości:

require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() 
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() 
C <- ggplot(CO2, aes(x=conc)) + geom_bar() +coord_flip()
D <- ggplot(CO2, aes(x=uptake)) + geom_bar() +coord_flip() 
grid.draw(cbind(
            rbind(ggplotGrob(A), ggplotGrob(B), size="first"),
            rbind(ggplotGrob(C), ggplotGrob(D), size="first"),
            size='first'))
 11
Author: Wilbert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 10:06:55

Oto inne możliwe rozwiązanie przy użyciu {[1] } z pakietu reshape2 i facet_wrap:

library(ggplot2)
library(reshape2)

dat = CO2[, c(1, 2)]
dat$id = seq(nrow(dat))
mdat = melt(dat, id.vars="id")

head(mdat)
#   id variable value
# 1  1    Plant   Qn1
# 2  2    Plant   Qn1
# 3  3    Plant   Qn1
# 4  4    Plant   Qn1
# 5  5    Plant   Qn1
# 6  6    Plant   Qn1

plot_1 = ggplot(mdat, aes(x=value)) + 
         geom_bar() + 
         coord_flip() +
         facet_wrap(~ variable, nrow=2, scales="free", drop=TRUE)

ggsave(plot=plot_1, filename="plot_1.png", height=4, width=6)

Tutaj wpisz opis obrazka

 8
Author: bdemarest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 20:52:39

Pakiet egg zawija obiekty ggplot do standardowej tabeli 3x3 gtable, umożliwiając wyrównanie paneli wykresu między dowolnymi ggplotami, w tym również powierzchownymi.

library(egg) # devtools::install_github('baptiste/egg')
library(ggplot2)

p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() 

p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) +
  geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") +
  guides(colour="none") +
  theme()

ggarrange(p1, p2)

Tutaj wpisz opis obrazka

 7
Author: baptiste,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-13 00:24:49

W najlepszym razie jest to hack:

library(wq)
layOut(list(A, 1, 2:16),  list(B, 2:3, 1:16))
Ale wydaje się to naprawdę złe.
 0
Author: Tyler Rinker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-08 18:14:27

Wiem, że to stary post i że już na niego odpowiedziano, ale proponuję połączyć podejście @baptiste z purrr, aby było ładniej:

library(purrr)
list(A, B) %>% 
  map(ggplotGrob) %>% 
  do.call(gridExtra::gtable_rbind, .) %>% 
  grid::grid.draw()
 0
Author: Felipe Gerard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 16:35:05